﻿#ifndef __SS_MYSQL_STMT_H__
#define __SS_MYSQL_STMT_H__
#include "../ssMySQLDefin.h"
#include <string>

namespace StarSeeker
{
//查询基类
class ssMySQLConnection;
class ssMySQLStmt
{
public:
	ssMySQLStmt();
	~ssMySQLStmt();
	//初始化
	void Init(ssMySQLConnection * pConn);
	//释放对象
	void Clear();
	//准备查询
	int PrepareQuery(const char* pIn, const char* pOut, const char* pSql, const u8 resultFlag);
	//执行查询
	int ExecuteQueryVariable(i32 num, ...);
	int ExecuteQueryVariable(i32 num, va_list& arglist);
	int ExecuteQueryStream(u32 len, const char* data);
	//获取查询类型
	u8 GetResultFlag() {return m_resFlag;}
	//初始化完毕？
	bool IsPrepared() { return m_state == 2; }
	//返回查询语句
	const char* GetSql() { return m_sql.c_str(); }
	//获取查询结果并写入到输出缓冲区
	i64 FormatResult();
	//重新预处理
	int Prepare();
	//获取错误字符串
	const char* StmtError() { return mysql_stmt_error(m_hStmt); }
	//获取错误代码
	u32 StmtErrno() { return mysql_stmt_errno(m_hStmt); }
	//清空结果缓冲区
	void ClearResult();
private:
	//错误检测
	void CheckError(int ret);
	//清空参数数组
	void ResetParam();
	//执行查询
	int ExecuteSQL(MYSQL_BIND *pin);
	//获取查询结果集
	int GetSQLResult(MYSQL_BIND *pout);


	ssMySQLConnection*	m_pConnect;		//连接对象
	MYSQL_STMT*			m_hStmt;		//预处理句柄
	u8					m_resFlag;		//查询类型
	u32					m_numIn;		//输入参数个数
	u32					m_numOut;		//输出参数个数
	MYSQL_BIND	*		m_in;			//mysql输入参数数组
	MYSQL_BIND	*		m_out;			//mysql输出参数数组
	QueryParam_s**		m_inParam;		//输入参数数组
	QueryParam_s**		m_outParam;		//输出参数数组
	std::string			m_inParamStr;	//输入参数语句
	std::string			m_outParamStr;	//输出参数语句
	std::string			m_sql;			//sql语句
	u8					m_state;		//0没有初始化，1没有预处理，2可以使用
};

}
#endif
